home *** CD-ROM | disk | FTP | other *** search
- TITLE MONITOR DISK ACTIVITIES
-
- ;-------------------------------------------;
- ; ;
- ; MONDISK was written by Scott Pakin, 1985. ;
- ; This program may be distributed freely. ;
- ; ;
- ;-------------------------------------------;
-
- INTERRUPTS SEGMENT AT 0H ;This is where the disk interrupt
- ORG 13H*4 ;is located
- DISK_INT LABEL DWORD
- INTERRUPTS ENDS
-
- CODE_SEG SEGMENT
- ASSUME CS:CODE_SEG
- ORG 100H ;ORG = 100H to make this into a .COM file
- FIRST: JMP INIT ;First time through jump to initialize routine
-
- OLD_DISK_INT DD ?
-
- MSG1: DB 13,10
- DB 'MONITOR DISK ACTIVITIY',13,10
- DB ' by Scott Pakin',13,10,10
- DB 'All disk activities will be shown in the upper lefthand',13,10
- DB 'corner of the screen. The codes are as follows:',13,10
- DB ' R = reading',13,10
- DB ' W = writing',13,10
- DB ' V = verifying',13,10
- DB ' F = formatting',13,10
- DB 'Note: This program probably will not work with most RAM disks.'
- DB 13,10,10,'$'
-
- DSK PROC NEAR ;The disk interrupt will now come here.
- ASSUME CS:CODE_SEG
- PUSH AX ;Save the used registers for good form
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH DI
- PUSH SI
- PUSH DS
- PUSH ES
- PUSHF
-
- PUSH DX ;SAVE A FEW OTHER THINGS
- PUSH CX
- PUSH BX
- PUSH AX
- JMP THERE
-
- ATTR DW ? ;LOCATION FOR CHARACTER/ATTRIBUTE
- DX1 DW ?
- CX1 DW ?
- AX1 DW ?
- FLAGS1 DB ?
-
- THERE: XOR BH,BH ;GET CURSOR POSITION
- MOV AH,3
- INT 10H
- MOV CX1,CX ;SAVE IT
- MOV DX1,DX
- MOV DH,0 ;MOVE CURSOR TO UPPER LEFT
- MOV DL,79
- MOV AH,2
- INT 10H
- MOV AH,8 ;READ ATTRIBUTE/CHARACTER
- INT 10H
- MOV ATTR,AX ;SAVE IT
-
- POP AX ;GET REQUEST
- PUSH AX ;SAVE IT AGAIN
- CMP AH,1 ;RESET OR STATUS --
- JLE OLD_R ;DON'T DO ANYTHING SPECIAL
-
- CMP AH,2 ;READ?
- JNE C1 ;NO -- CONTINUE
- MOV BL,15 ;HIGH INTENSITY
- MOV CX,1 ;WRITE ONE CHARACTER
- MOV AL,'R' ;AN "R"
- MOV AH,9
- INT 10H
- JMP OLD_R
-
- C1: CMP AH,3 ;WRITE?
- JNE C2 ;NO -- CONTINUE
- MOV BL,15 ;HIGH INTENSITY
- MOV CX,1 ;WRITE ONE CHARACTER
- MOV AL,'W' ;A "W"
- MOV AH,9
- INT 10H
- JMP OLD_R
-
- C2: CMP AH,4 ;VERIFY?
- JNE C3 ;NO -- CONTINUE
- MOV BL,15 ;HIGH INTENSITY
- MOV CX,1 ;WRITE ONE CHARACTER
- MOV AL,'V' ;A "V"
- MOV AH,9
- INT 10H
- JMP OLD_R
-
- C3: CMP AH,5 ;FORMAT?
- JNE OLD_R ;NO -- CONTINUE
- MOV BL,15 ;HIGH INTENSITY
- MOV CX,1 ;WRITE ONE CHARACTER
- MOV AL,'F' ;AN "F"
- MOV AH,9
- INT 10H
-
- OLD_R: POP AX ;RECALL REQUEST
- POP BX
- POP CX
- POP DX
- CALL OLD_DISK_INT ;CALL OLD ROUTINE
- MOV AX1,AX
- LAHF
- MOV FLAGS1,AH
-
- MOV AX,ATTR ;GET OLD ATTRIBUTE
- MOV BL,AH
- MOV CX,1
- XOR BH,BH
- MOV AH,9
- INT 10H
-
- MOV CX,CX1 ;RESTORE CURSOR POSITION
- MOV DX,DX1
- MOV AH,2
- INT 10H
-
- OUT: POP ES ;Having done Pushes, here are the Pops
- POP DS
- POP SI
- POP DI
- POP DX
- POP CX
- POP BX
- POP AX
-
- POP DX ;REALLY IP
- POP CX ;REALLY CS
- POPF
- MOV AH,FLAGS1
- SAHF
- PUSHF
- PUSH CX
- PUSH DX
- MOV AX,AX1
- IRET ;An interrupt needs an IRET
- DSK ENDP
-
- INIT PROC NEAR ;This procedure intializes everything
-
- LEA DX,MSG1 ;Print initial message
- MOV AH,9
- INT 21H
-
- ASSUME DS:INTERRUPTS ;The data segment will be the Interrupt area
- MOV AX,INTERRUPTS
- MOV DS,AX
-
- MOV AX,DISK_INT ;Get the old interrupt service routine
- MOV OLD_DISK_INT,AX ;address and put it into our location
- MOV AX,DISK_INT[2] ;OLD_DISK_INT so we can call it.
- MOV OLD_DISK_INT[2],AX
-
- MOV DISK_INT,OFFSET DSK ;Now load the address of our notepad
- MOV DISK_INT[2],CS ;routine into the disk interrupt
-
- EXIT: MOV DX,OFFSET INIT ;Set up everything but INIT to
- INT 27H ;stay and attach itself to DOS
- INIT ENDP
-
- CODE_SEG ENDS
-
- END FIRST ;END "FIRST" so 8088 will go to FIRST first.
-